﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Media;
using System.Collections.ObjectModel;
using System.Data;
using System.Windows.Media.Imaging;
using System.ComponentModel;
using System.Diagnostics;
using System.Windows.Controls;
using System.Globalization;
using produccion.modelo;
using produccion.AccesoDatos;
using produccion.clases;
using produccion.modulos;
using System.Windows.Input;
using System.IO;
using System.Collections.Specialized;
using System.Drawing.Printing;

namespace produccion.vistamodelo
{
    class VMAnularFactura : ViewModelBase
    {
        #region Campos
        private MFacturacion.anularfactura _anular = new MFacturacion.anularfactura();
        private CLSMAECLIP _cliente = new CLSMAECLIP();
        private CLSCCPFAC _concepto = new CLSCCPFAC();
        private ProcesoProduccionRepositorio _repositorio = new ProcesoProduccionRepositorio();
        #endregion

        #region Constructor

        public VMAnularFactura()
        {
            try
            {
                if (MDOgeneral.conexion == null || MDOgeneral.conexion.State == ConnectionState.Closed)
                {
                    MDOgeneral.conectar();
                }
                strTituloVentana = "Anular Facturas - Usuario: " + MDOgeneral.usuario + " - [FRMAnularFacturas]";
                limpiar();
            }
            catch (Exception ex) { MessageBox.Show(ex.Message); }
        }

        #endregion

        #region Comandos
        RelayCommand _cmdLimpiar;
        public ICommand cmdLimpiar
        {
            get
            {
                if (_cmdLimpiar == null)
                {
                    _cmdLimpiar = new RelayCommand(x => this.limpiar());
                }
                return _cmdLimpiar;
            }
        }

        RelayCommand _cmdImprimir;
        public ICommand cmdImprimir
        {
            get
            {
                if (_cmdImprimir == null)
                {
                    _cmdImprimir = new RelayCommand(x => this.imprimir(false));
                }
                return _cmdImprimir;
            }
        }

        RelayCommand _cmdAnular;
        public ICommand cmdAnular
        {
            get
            {
                if (_cmdAnular == null)
                {
                    _cmdAnular = new RelayCommand(x => this.anular());
                }
                return _cmdAnular;
            }
        }

        RelayCommand _cmdSalir;
        public ICommand cmdSalir
        {
            get
            {

                if (_cmdSalir == null)
                {
                    _cmdSalir = new RelayCommand(Salir);
                }
                return _cmdSalir;
            }
        }
        
        #endregion

        #region Propiedades

        private string _strTituloVentana;
        public string strTituloVentana
        {
            get { return _strTituloVentana; }
            set { _strTituloVentana = value; base.OnPropertyChanged("strTituloVentana"); }
        }

        private string _strNumeroDocumento;
        public string strNumeroDocumento
        {
            get { return _strNumeroDocumento; }
            set 
            {
                _strNumeroDocumento = value;                 
                if (_strNumeroDocumento != null)
                {
                    if (_strNumeroDocumento.Trim().Length > 6)
                    {
                        consultarFactura();                        
                    }
                    else
                    {
                        limpiar();
                        _strNumeroDocumento = value;
                    }
                    if (strNumeroDocumento.Trim().Length == 0)
                        limpiar();
                }
                base.OnPropertyChanged("strNumeroDocumento");
            }
        }

        private string _strCodigoCliente;
        public string strCodigoCliente
        {
            get { return _strCodigoCliente; }
            set { _strCodigoCliente = value; base.OnPropertyChanged("strCodigoCliente"); }
        }

        private string _strNombreCliente;
        public string strNombreCliente
        {
            get { return _strNombreCliente; }
            set { _strNombreCliente = value; base.OnPropertyChanged("strNombreCliente"); }
        }

        private DateTime _dtmFecha;
        public DateTime dtmFecha
        {
            get { return _dtmFecha; }
            set { _dtmFecha = value; base.OnPropertyChanged("dtmFecha"); }
        }

        private DateTime _dtmFechaVence;
        public DateTime dtmFechaVence
        {
            get { return _dtmFechaVence; }
            set { _dtmFechaVence = value; base.OnPropertyChanged("dtmFechaVence"); }
        }

        private string _strTipoDocumento;
        public string strTipoDocumento
        {
            get { return _strTipoDocumento; }
            set { _strTipoDocumento = value; base.OnPropertyChanged("strTipoDocumento"); }
        }

        private string _strEstado;
        public string strEstado
        {
            get { return _strEstado; }
            set { _strEstado = value; base.OnPropertyChanged("strEstado"); }
        }

        private string _strEmpresa;
        public string strEmpresa
        {
            get { return _strEmpresa; }
            set { _strEmpresa = value; base.OnPropertyChanged("strEmpresa"); }
        }

        private double _numDescuento;
        public double numDescuento
        {
            get { return _numDescuento; }
            set { _numDescuento = value; base.OnPropertyChanged("numDescuento"); }
        }

        private double _numTotalIva;
        public double numTotalIva
        {
            get { return _numTotalIva; }
            set { _numTotalIva = value; base.OnPropertyChanged("numTotalIva"); }
        }

        private double _numRetencion;
        public double numRetencion
        {
            get { return _numRetencion; }
            set { _numRetencion = value; base.OnPropertyChanged("numRetencion"); }
        }

        private double _numTotal;
        public double numTotal
        {
            get { return _numTotal; }
            set { _numTotal = value; base.OnPropertyChanged("numTotal"); }
        }

        private string _strCodigoConcepto;
        public string strCodigoConcepto
        {
            get { return _strCodigoConcepto; }
            set { _strCodigoConcepto = value; base.OnPropertyChanged("strCodigoConcepto"); }
        }

        private string _strNombreConcepto;
        public string strNombreConcepto
        {
            get { return _strNombreConcepto; }
            set { _strNombreConcepto = value; base.OnPropertyChanged("strNombreConcepto"); }
        }

        private string _strDetalle;
        public string strDetalle
        {
            get { return _strDetalle; }
            set { _strDetalle = value; base.OnPropertyChanged("strDetalle"); }
        }

        private ObservableCollection<VMAnularDetalle> _lisfactura = new ObservableCollection<VMAnularDetalle>();
        public ObservableCollection<VMAnularDetalle> lisfactura
        {
            get { return _lisfactura; }
            set { _lisfactura = value; base.OnPropertyChanged("lisfactura"); }
        }

        private VMAnularDetalle _sellisfactura;
        public VMAnularDetalle sellisfactura
        {
            get { return _sellisfactura; }
            set { _sellisfactura = value; base.OnPropertyChanged("sellisfactura"); }
        }

        private Boolean _logAnulada=false;
        public Boolean logAnulada
        {
            get { return _logAnulada; }
            set { _logAnulada = value; base.OnPropertyChanged("logAnulada"); }
        }

        private Boolean _logOK = false;
        public Boolean logOK
        {
            get { return _logOK; }
            set { _logOK = value; base.OnPropertyChanged("logOK"); }
        }

        private MDOgeneral.mensaje _msn = new MDOgeneral.mensaje();
        public MDOgeneral.mensaje msn
        {
            get { return _msn; }
            set { _msn = value; base.OnPropertyChanged("msn"); }
        }

        #endregion

        #region Metodos
        void consultarFactura()
        {
            try
            {
                Mouse.OverrideCursor = Cursors.Wait;

                // se consulta el encabezado
                DataTable fac = new MFacturacion.anularfactura().consultaEncabezado(strNumeroDocumento);

                if (fac.Rows.Count > 0)
                {
                    foreach (DataRow dr in fac.Rows)
                    {
                        logOK = true;
                        strCodigoCliente = dr["CODCLI_EFA"].ToString();
                        _cliente.CODCLI_CLI = strCodigoCliente;
                        _cliente.consultar();
                        strNombreCliente = _cliente.NOMCLI_CLI;
                        dtmFecha = Convert.ToDateTime(dr["FECFAC_EFA"]);
                        dtmFechaVence = Convert.ToDateTime(dr["VTOFAC_EFA"]);
                        strTipoDocumento = dr["TIPFAC_EFA"].ToString() == "FA" ? "Factura" : dr["TIPFAC_EFA"].ToString() == "NC" ? "Nota Credito" : dr["TIPFAC_EFA"].ToString() == "ND" ? "Nota Debito" : "Factura";
                        strEmpresa = dr["EMPRESA_EFA"].ToString() == "A" ? "Artesa" : "Artesa Pelle";
                        strCodigoConcepto = dr["CONCEP_EFA"].ToString();
                        _concepto.CODCCP_CFC = strCodigoConcepto;
                        _concepto.consultar();
                        strNombreConcepto = _concepto.NOMCCP_CFC;
                        logAnulada = dr["ESTADO_EFA"].ToString() == "X" ? true : false;
                        strEstado = dr["ESTADO_EFA"].ToString() == "X" ? "Anulada" : dr["ESTADO_EFA"].ToString() == "F" ? "Facturado" : "Causado";
                        numTotal = Convert.ToDouble(dr["VALFAC_EFA"]);
                        numTotalIva = Convert.ToDouble(dr["IVAFAC_EFA"]);
                        numRetencion = Convert.ToDouble(dr["RTEFAC_EFA"]);
                        numDescuento = Convert.ToDouble(dr["DTOFAC_EFA"]);
                    }

                    //Se consulta el detalle del documento
                    List<MFacturacion.anularfactura> lisAnular = new MFacturacion.anularfactura().consultarDetalle(strNumeroDocumento);

                    List<VMAnularDetalle> all = (from lis in lisAnular select new VMAnularDetalle(lis)).ToList();
                    int numcontador = 0;
                    foreach (VMAnularDetalle anu in all)
                    {
                        numcontador = numcontador + 1;
                    }
                    lisfactura.Clear();
                    lisfactura = new ObservableCollection<VMAnularDetalle>(all);
                }

                Mouse.OverrideCursor = Cursors.Arrow;
            }
            catch (Exception ex) { MessageBox.Show(ex.Message); }
        }

        public void imprimir(bool logAnulada)
        {
            try
            {
                Mouse.OverrideCursor = Cursors.Wait;

                MDOgeneral mod = new MDOgeneral();

                if (strNumeroDocumento != null)
                {
                    // Se captura la impresora por defecto
                    string strImpresora = "";
                    foreach (string strPrinter in PrinterSettings.InstalledPrinters)
                    {
                        PrinterSettings a = new PrinterSettings();
                        a.PrinterName = strPrinter.ToString();
                        if (a.IsDefaultPrinter)
                        {
                            strImpresora = a.PrinterName;
                        }
                    }

                    // Se imprime la factura

                    //Para saber si lo imprime por facturacion normal o facturacion varios
                    string query = "select count(*) as Total from (select distinct a.codtal_pro,a.codref_pro,a.codcol_pro, c.nroord_eod from maepro a inner join detordd b on a.codref_pro=b.codref_dod and a.codcol_pro=b.codcol_dod inner join encordd c on b.nroord_dod=c.nroord_eod where c.nrodes_eod='" + strNumeroDocumento.Trim() + "' order by a.codtal_pro) a left join detordd b on a.codref_pro=b.codref_dod and a.codcol_pro=b.codcol_dod and a.codtal_pro=b.codtal_dod and b.nroord_dod=a.nroord_eod ";
                    DataTable val = mod.consulta(query);

                    //
                    if (Convert.ToInt32(val.Rows[0][0]) > 0)
                    {
                        var imp = new ImprimirFactura();
                        string strMensaje = "";
                        if (logAnulada == true)
                        {
                            imp.ImprimirDatos(strNumeroDocumento, strImpresora, out strMensaje, 0, false, true); // Para que genere el nuevo PDF anulado
                            imp.ImprimirDatos(strNumeroDocumento, strImpresora, out strMensaje, 0, true, true); // Para que muestre por pantalla el PDF Anulado
                        }
                        else
                            imp.ImprimirDatos(strNumeroDocumento, strImpresora, out strMensaje, 0, true, false); // Para que muestre por pantalla la factura antes de anularla
                    }
                    else
                    {
                        string query1 = "select empresa_efa, tipfac_efa from encfacp where nrofac_efa = '" + strNumeroDocumento.Trim() + "'";
                        DataTable dtf = mod.consulta(query1);

                        string strTipDocu = dtf.Rows[0][1].ToString() == "FA" ? "FACTURA DE VENTA" : dtf.Rows[0][1].ToString() == "NC" ? "  NOTA CREDITO  " : "   NOTA DEBITO  ";

                        var imp = new ImprimirFacturaVarios();
                        string strMensaje = "";
                        if (logAnulada == true)
                        {
                            imp.ImprimirDatos(strNumeroDocumento, dtf.Rows[0][0].ToString(), strImpresora, out strMensaje, 0, strTipDocu, false, true); // Para que genere el nuevo PDF anulado 
                            imp.ImprimirDatos(strNumeroDocumento, dtf.Rows[0][0].ToString(), strImpresora, out strMensaje, 0, strTipDocu, true, true); // Para que muestre por pantalla el PDF Anulado                            
                        }
                        else
                            imp.ImprimirDatos(strNumeroDocumento, dtf.Rows[0][0].ToString(), strImpresora, out strMensaje, 0, strTipDocu, true, false); // Para que muestre por pantalla la factura antes de anularla
                    }
                }
                else
                {
                    MessageBox.Show("Falta ingresar el numero de factura.", "Inconsistencia", MessageBoxButton.OK, MessageBoxImage.Error, MessageBoxResult.OK);
                }

                Mouse.OverrideCursor = Cursors.Arrow;
            }
            catch (Exception ex) { MessageBox.Show(ex.Message); }
        }

        private void limpiar()
        {
            try
            {
                strNumeroDocumento = null;
                strCodigoCliente = null;
                strNombreCliente = null;
                dtmFecha = Convert.ToDateTime("01/01/" + DateTime.Now.Year.ToString()).Date;
                dtmFechaVence = Convert.ToDateTime("01/01/" + DateTime.Now.Year.ToString()).Date;
                strTipoDocumento = null;
                strEmpresa = null;
                strCodigoConcepto = null;
                strNombreConcepto = null;
                numTotal = 0;
                numTotalIva = 0;
                numRetencion = 0;
                numDescuento = 0;
                logAnulada = false;
                logOK = false;
                strEstado = null;
                lisfactura.Clear();
            }
            catch (Exception ex) { MessageBox.Show(ex.Message); }
        }

        private void anular()
        {
            try
            {
                if (MessageBox.Show("Esta seguro que desea Anular este Documento?", "Confirmar", MessageBoxButton.YesNo, MessageBoxImage.Question, MessageBoxResult.No) == MessageBoxResult.Yes)
                {
                    if (_repositorio.AnularFacturas(strNumeroDocumento))
                    {
                        imprimir(true);
                        msn.texto = "La Factura se Anuló con exito.";
                        msn.tipo = true;
                        limpiar();
                    }
                    else
                    {
                        msn.texto = "La Factura no se pudo Anular.";
                        msn.tipo = false;
                    }
                }
            }
            catch (Exception ex) { MessageBox.Show(ex.Message); }
        }

        public void Salir(object frmFormulario)
        {
            try
            {
                ((Window)frmFormulario).Close();
            }
            catch (Exception ex) { MessageBox.Show(ex.Message); }
        }
        #endregion
    }

    #region Vista-modelo Detalle Facura
    public class VMAnularDetalle : ViewModelBase
    {
        #region Campos
        private MFacturacion.anularfactura _items = new MFacturacion.anularfactura();
        #endregion

        #region Constructor

        public VMAnularDetalle(MFacturacion.anularfactura items)
        {
            _items = items;
        }

        public VMAnularDetalle()
        {

        }
        #endregion

        #region Propiedades

        public Int32 numConsecutivo
        {
            get { return _items.numConsecutivo; }
            set { _items.numConsecutivo = value; base.OnPropertyChanged("numConsecutivo"); }
        }

        public string strReferencia
        {
            get { return _items.strReferencia; }
            set { _items.strReferencia = value; }
        }

        public string strNombreReferencia
        {
            get { return _items.strNombreReferencia; }
            set { _items.strNombreReferencia = value; }
        }

        public double numCantidad
        {
            get { return _items.numCantidad; }
            set { _items.numCantidad = value; }
        }

        public double numPrecio
        {
            get { return _items.numPrecio; }
            set { _items.numPrecio = value; }
        }

        public double numIva
        {
            get { return _items.numIva; }
            set { _items.numIva = value; }
        }

        public double numDescuento
        {
            get { return _items.numDescuento; }
            set { _items.numDescuento = value; }
        }

        #endregion

        #region Metodos

        public MFacturacion.anularfactura getItems()
        {
            return _items;
        }

        #endregion
       
    }
    #endregion
}
